package ru.averta.notes.service.search;

import com.cybozu.labs.langdetect.Detector;
import com.cybozu.labs.langdetect.DetectorFactory;
import com.cybozu.labs.langdetect.LangDetectException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import ru.averta.notes.other.UtilsCommon;

import javax.annotation.PostConstruct;
import java.io.Reader;
import java.util.HashMap;

/**
 * <code>LanguageDetectServiceImpl</code>
 *
 * @author: fedor.belov (fedor.belov@mail.ru)
 * Date: 26.05.11 21:45
 */

@Service
public class LanguageDetectServiceImpl implements LanguageDetectService {

    private static final Logger logger = LoggerFactory.getLogger(LanguageDetectServiceImpl.class);

    @Autowired private UtilsCommon uc;

    @Value("${path.folder.search.profiles}")
    private String profilesPath;

    @PostConstruct
    public void setUp() throws LangDetectException {
        logger.debug("Загружаем данные для определения языка по пути - {}", profilesPath);
        DetectorFactory.loadProfile(profilesPath);
    }

    @Override
    public Language detect(String source) {
        /*return detect(UtilsCommon.stringToReader(source));*/
        try {
            Detector detector = null;
            detector = DetectorFactory.create();

            // Повышаем приоритет русского языка + ограничиваем определение двумя языками
            // http://code.google.com/p/language-detection/wiki/FrequentlyAskedQuestion
            HashMap priorMap = new HashMap();
            priorMap.put("en", new Double(0.0001));
            priorMap.put("ru", new Double(0.9999));
            detector.setPriorMap(priorMap);

            detector.append(source);
            return LanguageDetectService.Language.myValueOf(detector.detect());
        } catch (Exception e) {
            logger.error("Ошибка при определении языка для '" + source + "'", e);
            return LanguageDetectService.Language.RU;
        }
    }

    @Override
    public Language detect(Reader source) {
        /** Хотя есть метод detect(Reader), он преобразует данные к string + преобразует какак-то косячно */
        return detect(UtilsCommon.readerToString(source));
    }

}
